Atskleiskite Python galimybes genetiniam programavimui. Nagrinėkite evoliucinių algoritmų dizainą, pagrindines sąvokas, praktines programas ir pirmaujančias bibliotekas, kad išspręstumėte sudėtingas pasaulines problemas.
Pythoninė genetinė programavimas: evoliucinių algoritmų kūrimas sudėtingoms problemoms spręsti
Visame pasaulyje, kuriame vis labiau dominuoja sudėtingi duomenys ir dinamiška aplinka, tradiciniai algoritmų sprendimai dažnai pasiekia savo ribas. Nuo pasaulinių tiekimo grandinių optimizavimo iki naujų mokslinių hipotezių atradimo ar adaptivaus dirbtinio intelekto projektavimo – daugelis iššūkių atsispiria įprastiniams taisyklių pagrindu ar išsamiems paieškos metodams. Įveskite Genetinį Programavimą (GP) – galingą paradigmą, kuri panaudoja natūralios evoliucijos principus automatiškai kurti kompiuterines programas, galinčias spręsti sudėtingas problemas. Ir didelės jos sklaidos bei inovacijų centre yra Python, kalba, garsėjanti savo skaitomumu, universalumu ir turtinga mokslinių bibliotekų ekosistema.
Šis "išsamus" vadovas gilinsis į žavingą Python genetinio programavimo sritį. Nagrinėsime pagrindines koncepcijas, kurios sudaro evoliucinių algoritmų dizaino pagrindą, žingsnis po žingsnio pereisime prie praktinių GP sistemų kūrimo, išnagrinėsime įvairias pasaulines jos programas ir pristatysime jums pirmaujančias Python bibliotekas, kurios suteikia jėgą šiai pažangiausiai sričiai. Nesvarbu, ar esate duomenų mokslininkas, programinės įrangos inžinierius, tyrinėtojas, ar tiesiog technologijų entuziastas, supratimas GP su Python atveria duris novatoriškiems sprendimams, skirtiems kai kuriems didžiausių žmonijos problemų sprendimui.
Kas yra genetinė programavimas? Evoliucinė perspektyva
Genetinė programavimas yra evoliucinės kompiuterijos dalis, įkvėpta Charleso Darvino natūralios atrankos teorijos. Užuot tiesiogiai programuojant sprendimą, GP evoliucionuoja kandidatinių programų populiaciją, nuolat jas tobulindama procesais, panašiais į biologinę evoliuciją: atranką, kryžminimą (rekombinaciją) ir mutaciją. Tikslas yra atrasti programą, kuri optimaliai arba beveik optimaliai atliktų nurodytą užduotį, net jei tiksli optimalios programos pobūdis yra nežinomas.
GP skyrimas nuo genetinių algoritmų (GA)
Nors dažnai painiojama, svarbu suprasti skirtumą tarp genetinio programavimo ir genetinių algoritmų (GA). Abu yra evoliuciniai algoritmai, bet skiriasi tuo, ką jie evoliucionuoja:
- Genetiniai algoritmai (GA): Paprastai evoliucionuoja fiksuoto ilgio eilutes (dažnai dvejetaines ar skaitines), atstovaujančias problemos parametrus ar specifinius sprendimus. Pavyzdžiui, GA gali optimizuoti neuroninio tinklo svorius ar gamybos užduočių tvarkaraštį. Sprendimo struktūra yra iš anksto apibrėžta; evoliucionuoja tik jo vertės.
- Genetinis programavimas (GP): Evoliucionuoja pačias kompiuterines programas, kurios gali skirtis dydžiu, forma ir sudėtingumu. Šios programos dažnai atstovaujamos medžių struktūromis, kur vidiniai mazgai yra funkcijos (pvz., aritmetiniai operatoriai, loginės sąlygos), o lapiniai mazgai yra terminalai (pvz., kintamieji, konstantos). GP ieško ne tik optimalių parametrų, bet ir optimalių programos struktūrų. Ši galimybė evoliucionuoti bet kokias struktūras daro GP nepaprastai galingu naujų sprendimų paieškai problemoms, kurių sprendimo forma yra nežinoma arba labai kintanti.
Įsivaizduokite, kad bandote rasti geriausią matematinę formulę, kuri apibūdintų duomenų rinkinį. GA gali optimizuoti iš anksto apibrėžto polinomo koeficientus, tarkime, ax^2 + bx + c. Tačiau GP galėtų evoliucionuoti visą formulę, galbūt atrandant ką nors panašaus į sin(x) * log(y) + 3*z, be jokios išankstinės prielaidos apie jos formą. Tai yra pagrindinė GP galia.
Neprilygstama Python galia genetiniam programavimui
Python pakilimas kaip dominuojanti kalba dirbtinio intelekto, mašininio mokymosi ir mokslinių skaičiavimų srityse nėra atsitiktinis. Jos vidinės savybės daro ją idealią aplinką genetiniam programavimui įgyvendinti ir su juo eksperimentuoti:
- Skaitomumas ir paprastumas: Python aiški, į anglų kalbą panaši sintaksė sumažina kognityvinę naštą suprantant sudėtingus algoritmus, leidžiant tyrėjams ir kūrėjams sutelkti dėmesį į evoliucinę logiką, o ne į pagrindinį kodą.
- Platus ekosistemos ir bibliotekų pasirinkimas: Galima naudoti daugybę aukštos kokybės bibliotekų. Konkrečiai GP atveju tokie karkasai kaip DEAP (Distributed Evolutionary Algorithms in Python) suteikia tvirtas, lanksčias ir efektyvias priemones. Bendros mokslinės bibliotekos, tokios kaip NumPy, SciPy ir Pandas, palengvina duomenų tvarkymą ir skaitines operacijas, būtinas tinkamumo funkcijos vertinimui.
- Spartus prototipų kūrimas ir eksperimentavimas: GP tyrimų iteracinis pobūdis labai naudingas Python gebėjimui leisti greitai kurti ir testuoti naujas idėjas ir hipotezes. Tai pagreitina algoritmų dizaino, modifikavimo ir vertinimo ciklą.
- Universalumas ir integracija: Python universalumas reiškia, kad GP sprendimai gali būti nepastebimai integruoti į didesnes sistemas, nepriklausomai nuo to, ar jos apima žiniatinklio programas, duomenų srautus, ar mašininio mokymosi karkasus. Tai labai svarbu išvystytų sprendimų diegimui realaus pasaulio, gamybos aplinkose įvairiose pramonės šakose, nuo finansų iki sveikatos priežiūros iki inžinerijos.
- Bendruomenės parama: Didelė ir aktyvi pasaulinė bendruomenė prisideda prie Python bibliotekų, dokumentacijos ir problemų sprendimo forumų, teikdama neįkainojamą paramą tiek pradedantiesiems, tiek pažengusiems GP specialistams.
Šie privalumai leidžia Python tapti pagrindine kalba tiek akademiniams tyrimams, tiek pramoninėms genetinio programavimo programoms, skatinant inovacijas tarp žemynų ir disciplinų.
Evoliucinių algoritmų branduolio koncepcijos genetiniame programavime
Suprasti pagrindinius GP statybinius elementus yra būtina kuriant efektyvius evoliucinius algoritmus. Išskaidykime šiuos pagrindinius komponentus:
1. Asmenys ir programos atvaizdavimas
GP, "asmuo" yra kandidatinė programa, kuri bando išspręsti problemą. Šios programos dažniausiai atstovaujamos medžių struktūromis. Apsvarstykite paprastą matematinę išraišką, pvz., (X + 2) * Y. Tai galima atvaizduoti kaip medį:
*
/ \
+ Y
/ \
X 2
- Vidinis mazgai (funkcijos): Tai operacijos, kurios priima vieną ar daugiau argumentų ir grąžina vertę. Pavyzdžiai apima aritmetinius operatorius (
+,-,*,/), matematines funkcijas (sin,cos,log), loginius operatorius (AND,OR,NOT) arba specifines domenui funkcijas. - Lapinis mazgai (terminalai): Tai programos įėjimai ar konstantos. Pavyzdžiai apima kintamuosius (
X,Y), skaitines konstantas (0,1,2.5) arba boolean reikšmes (True,False).
Turimų funkcijų ir terminalų rinkinys sudaro "pradinį rinkinį" – tai esminis dizaino pasirinkimas, apibrėžiantis GP algoritmo paieškos erdvę. Pradinio rinkinio pasirinkimas tiesiogiai įtakoja programų, kurias galima evoliucionuoti, sudėtingumą ir išraiškingumą. Gerai parinktas pradinio rinkinio rinkinys gali žymiai padidinti galimybes rasti efektyvų sprendimą, o prastai parinktas rinkinys gali padaryti problemą GP neįveikiama.
2. Populiacija
Evoliucinis algoritmas veikia ne su viena programa, o su programų populiacija. Šis įvairovumas yra svarbus efektyviai tyrinėjant paieškos erdvę. Tipinis populiacijos dydis gali svyruoti nuo dešimčių iki tūkstančių asmenų. Didesnė populiacija paprastai suteikia daugiau įvairovės, bet už tai sumokama didesnėmis skaičiavimo išlaidomis vienai kartai.
3. Tinkamumo funkcija: Gidinis kompasas
Tinkamumo funkcija yra, ko gero, svarbiausias bet kurio evoliucinio algoritmo komponentas, ir ypač GP. Ji kiekybiškai nustato, kaip gerai asmeninė programa sprendžia duotą problemą. Aukštesnė tinkamumo reikšmė rodo geriau veikiančią programą. Tinkamumo funkcija vadovauja evoliuciniam procesui, nustatydama, kurie asmenys labiau tikėtini, kad išgyvens ir dauginasi.
Efektyvios tinkamumo funkcijos projektavimas reikalauja kruopštaus apsvarstymo:
- Tikslumas: Užduotims, tokioms kaip simbolinė regresija ar klasifikacija, tinkamumas dažnai tiesiogiai susijęs su tuo, kaip tiksliai programa prognozuoja rezultatus ar klasifikuoja duomenų taškus.
- Pilnumas: Ji turi apimti visus svarbius problemos aspektus.
- Skaičiavimo efektyvumas: Tinkamumo funkcija gali būti vertinama potencialiai milijonus kartų, todėl ji turi būti skaičiuojamai įgyvendinama.
- Vadovavimas: Idealiu atveju tinkamumo kraštovaizdis turėtų būti pakankamai lygus, kad suteiktų gradientą evoliucinei paieškai, net jei tikslus kelias į optimalumą yra nežinomas.
- Baudos: Kartais įtraukiamos baudos už nepageidaujamas savybes, tokias kaip programos sudėtingumas (kad būtų sumažintas "išsipūtimas") arba apribojimų pažeidimas.
Tinkamumo funkcijų pavyzdžiai:
- Simbolinė regresija: Vidutinis kvadratinių klaidų (MSE) arba kvadratinių klaidų šaknies (RMSE) tarp programos rezultato ir tikslinių reikšmių.
- Klasifikacija: Tikslumas, F1 balas, ROC kreivės (veikimo charakteristikos) plotas po kreive.
- Žaidimų DI: Žaidime pasiektas rezultatas, išgyvenimo laikas, nugalėtų priešininkų skaičius.
- Robotika: Nuvažiuotas atstumas, energijos efektyvumas, užduoties įvykdymo laipsnis.
4. Atranka: Tėvų pasirinkimas
Įvertinus visų populiacijos asmenų tinkamumą, atrankos mechanizmas nustato, kurios programos taps "tėvais" kitai kartai. Geriau tinkami asmenys turi didesnę tikimybę būti atrinkti. Dažni atrankos metodai apima:
- Turnyrinė atranka: Atsitiktinai pasirenkamas nedidelis asmenų pogrupis (turnyro dydis) iš populiacijos, ir geriausiai tinkantis asmuo tarp jų pasirenkamas kaip tėvas. Tai kartojama, kad būtų atrinktas reikiamas tėvų skaičius. Tai tvirtas ir plačiai naudojamas metodas.
- Ruletės rato atranka (tinkamumui proporcinga atranka): Asmenys atrenkami tikimybe, proporcinga jų tinkamumui. Konceptualiai sukamas ruletės ratas, kur kiekvienas asmuo užima skiltį, proporcingą jo tinkamumui.
- Rangių pagrindu atranka: Asmenys reitinguojami pagal tinkamumą, o atrankos tikimybė grindžiama reitingu, o ne absoliutinėmis tinkamumo reikšmėmis. Tai gali padėti išvengti ankstyvo konvergencijos dėl kelių itin tinkamų asmenų.
5. Genetiniai operatoriai: Naujų asmenų kūrimas
Kai tėvai yra atrinkti, genetiniai operatoriai naudojami kurti palikuonis kitai kartai. Šie operatoriai įveda įvairovę ir leidžia populiacijai tyrinėti naujus sprendimus.
a. Kryžminimas (rekombinacija)
Kryžminimas sujungia dviejų tėvų programų genetinę medžiagą, kad sukurtų vieną ar daugiau naujų palikuonių programų. Medžių pagrindu GP, dažniausias tipas yra pogrupio kryžminimas:
- Pasirenkamos dvi tėvų programos.
- Iš kiekvieno tėvo pasirenkamas atsitiktinis pogrupis.
- Šie pasirinkti pogrupiai tada keičiami tarp tėvų, sukuriant dvi naujas palikuonių programas.
Tėvas 1: (A + (B * C)) Tėvas 2: (D - (E / F)) Pasirinkite pogrupį (B * C) iš Tėvo 1 Pasirinkite pogrupį (E / F) iš Tėvo 2 Palikuonis 1: (A + (E / F)) Palikuonis 2: (D - (B * C))
Kryžminimas leidžia tyrinėti naujus programų komponentų derinius, propaguojant sėkmingus statybinius elementus tarp kartų.
b. Mutacija
Mutacija įveda atsitiktinius pakeitimus į asmeninę programą, užtikrina genetinę įvairovę ir padeda išvengti lokalių optimalumų. Medžių pagrindu GP, dažni mutacijos tipai apima:
- Pogrupio mutacija: Atsitiktinis pogrupis programoje pakeičiamas naujai sukurtu atsitiktiniu pogrupiu. Tai gali sukelti žymių pokyčių.
- Taškinė mutacija: Terminalas pakeičiamas kitu terminalu, arba funkcija pakeičiama kita tos pačios aritės (argumentų skaičiaus) funkcija. Tai sukelia mažesnius, lokalizuotus pokyčius.
Originali programa: (X * (Y + 2)) Pogrupio mutacija (pakeisti (Y + 2) nauju atsitiktiniu pogrupiu (Z - 1)): Nauja programa: (X * (Z - 1)) Taškinė mutacija (pakeisti '*' su '+'): Nauja programa: (X + (Y + 2))
Mutacijos dažniai paprastai būna maži, subalansuojant poreikį tyrinėti ir išsaugoti geras sprendimus.
6. Baigimo kriterijai
Evoliucinis procesas tęsiasi, kol pasiekiamas nurodytas baigimo kriterijus. Dažni kriterijai apima:
- Maksimalus kartų skaičius: Algoritmas sustoja po fiksuoto iteracijų skaičiaus.
- Tinkamumo slenkstis: Algoritmas sustoja, kai asmuo pasiekia iš anksto nustatytą tinkamumo lygį.
- Laiko limitas: Algoritmas sustoja pasibaigus tam tikram skaičiavimui.
- Nėra patobulinimo: Algoritmas sustoja, jei geriausias populiacijos tinkamumas nepagerėjo per tam tikrą kartų skaičių.
Evoliucinio algoritmo projektavimas: žingsnis po žingsnio vadovas su Python
Apžvelkime praktinius žingsnius, susijusius su genetinės programavimo sistemos projektavimu ir įgyvendinimu naudojant Python. Mes daugiausia remsimės DEAP bibliotekos pateiktomis koncepcijomis ir struktūra, kuri yra de facto standartas evoliucinei kompiuterinei įmonei Python.
1 žingsnis: Problemos formulavimas ir duomenų paruošimas
Aiškiai apibrėžkite problemą, kurią norite išspręsti. Ar tai simbolinė regresija, klasifikacija, kontrolė, ar kažkas kita? Surinkite ir paruoškite savo duomenis. Pavyzdžiui, jei tai simbolinė regresija, jums reikės įvesties kintamųjų (bruožų) ir atitinkamų tikslinių reikšmių.
2 žingsnis: Pradinio rinkinio (funkcijų ir terminalų) apibrėžimas
Čia nurodote statybinius elementus, iš kurių bus sudarytos jūsų programos. Turite nuspręsti, kurie matematiniai operatoriai, loginės funkcijos ir įvesties kintamieji/konstantos yra svarbūs jūsų problemai. DEAP tai daroma naudojant PrimitiveSet.
Pavyzdys: Simbolinė regresija
Problemai, kurioje ieškote funkcijos f(x, y) = ?, kuri apytiksliai atitiktų tam tikrą rezultatą z, jūsų pradinio rinkinio rinkinys gali apimti:
- Funkcijos:
add,sub,mul,div(apsaugotas dalijimas, kad būtų tvarkomi nulinio daliklio atvejai) - Terminalai:
x,yir galbūt efemeriškos konstantos (atsitiktinai generuojami skaičiai diapazone).
from deap import gp
import operator
def protectedDiv(left, right):
try:
return left / right
except ZeroDivisionError:
return 1 # Arba kita neutrali reikšmė
pSet = gp.PrimitiveSet("main", arity=2) # arity=2 x, y įėjimams
pSet.addPrimitive(operator.add, 2) # add(a, b)
pSet.addPrimitive(operator.sub, 2) # sub(a, b)
pSet.addPrimitive(operator.mul, 2) # mul(a, b)
pSet.addPrimitive(protectedDiv, 2) # protectedDiv(a, b)
pSet.addTerminal(1) # konstanta 1
# Per名前kintamųjų aiškumui
pSet.renameArguments(ARG0='x', ARG1='y')
3 žingsnis: Tinkamumo funkcijos apibrėžimas
Parašykite Python funkciją, kuri priima asmeninę programą (atstovaujamą kaip medį) ir grąžina jos tinkamumo reikšmę. Tai apima:
- Programos medžio sudarymą į vykdomąją Python funkciją.
- Šios funkcijos vykdymą su jūsų mokymo duomenimis.
- Klaidos arba rezultato skaičiavimą pagal programos rezultatą ir tikslines reikšmes.
Simbolinės regresijos atveju tai paprastai apimtų vidutinių kvadratinių klaidų (MSE) skaičiavimą. Nepamirškite grąžinti TUPLE, nes DEAP tikisi tinkamumo reikšmių kaip TUPLE (pvz., (mse,) vieno tikslo optimizavimui).
import numpy as np
# Laikinasis vietų rezervavimas faktiniams duomenims. Realiu scenarijumi jie būtų įkelti.
training_data_points = [(i, i*2) for i in range(-5, 5)] # Įėjimų pavyzdys
training_data_labels = [p[0]**2 + p[1] for p in training_data_points] # Tikslų pavyzdys (x^2 + y)
def evalSymbReg(individual, points, labels):
# GP medį paversti Python funkcija
func = gp.compile(individual, pset)
# Programos vertinimas įvesties 'points'
# Tvarkyti galimas vykdymo klaidas iš evoliucionuotų programų (pvz., matematikos domenų klaidas)
sqerrors = []
for p, l in zip(points, labels):
try:
program_output = func(p[0], p[1])
sqerrors.append((program_output - l)**2)
except (OverflowError, ValueError, TypeError): # Pagauti dažnas klaidas
sqerrors.append(float('inf')) # Sunkiai nubausti neteisingus rezultatus
if float('inf') in sqerrors or not sqerrors: # Jei visos klaidos yra begalinės arba negalėjo būti apskaičiuotos jokios klaidos
return float('inf'), # Grąžinti begalinį tinkamumą
return np.mean(sqerrors), # Grąžinti kaip TUPLE
4 žingsnis: DEAP Toolbox konfigūravimas
DEAP Toolbox yra centrinis komponentas, skirtas visų reikiamų evoliucinio algoritmo komponentų registravimui ir konfigūravimui: asmenų kūrimas, populiacijos kūrimas, tinkamumo vertinimas, atranka, kryžminimas ir mutacija.
from deap import base, creator, tools
# 1. Tinkamumo ir asmenų tipų apibrėžimas
# Tinkamumo mažinimas (pvz., Vidutinių kvadratinių klaidų). weights=(-1.0,) minimizavimui, (1.0,) maximizavimui
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
# Asmuo yra PrimitiveTree iš gp modulio, su apibrėžtu tinkamumo tipu
creator.create("Individual", gp.PrimitiveTree, fitness=creator.FitnessMin)
# 2. Toolbox inicializavimas
toolbox = base.Toolbox()
# 3. Komponentų registravimas
# 'expr' generatorius pradinei populiacijai (pvz., ramped half-and-half metodas)
# min_=1, max_=2 reiškia, kad medžių gilumas bus nuo 1 iki 2
toolbox.register("expr", gp.genHalfAndHalf, pset=pset, min_=1, max_=2)
# 'individual' kūrėjas: sujungia 'PrimitiveTree' tipą su 'expr' generatoriumi
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.expr)
# 'population' kūrėjas: asmenų sąrašas
toolbox.register("population", tools.initRepeat, list, toolbox.individual)
# Vertinimo funkcijos (tinkamumo funkcijos) registravimas su specifiniais duomenimis
toolbox.register("evaluate", evalSymbReg, points=training_data_points, labels=training_data_labels)
# Genetiniai operatoriai
toolbox.register("select", tools.selTournament, tournsize=3) # Turnyrinė atranka su dydžiu 3
toolbox.register("mate", gp.cxOnePoint) # Vienos taško kryžminimas medžio struktūroms
# Mutacija: Atsitiktinis pogrupis pakeičiamas nauju atsitiktinai sugeneruotu pogrupiu
toolbox.register("mutate", gp.mutUniform, expr=toolbox.expr, pset=pset)
5 žingsnis: Statistinių duomenų ir registravimo sąranka
Norint stebėti evoliucinio algoritmo eigą, svarbu rinkti statistiką apie populiaciją (pvz., geriausias tinkamumas, vidutinis tinkamumas, programos dydis). DEAP Statistics objektas ir HallOfFame yra naudingi tam.
mstats = tools.Statistics(lambda ind: ind.fitness.values)
# Įvairių statistikos duomenų apskaičiavimo ir saugojimo kiekvienai kartai registravimas
avg mstats.register("avg", np.mean)
std mstats.register("std", np.std)
min mstats.register("min", np.min)
max mstats.register("max", np.max)
hof = tools.HallOfFame(1) # Saugo geriausią vieną asmenį, rastą evoliucijos metu
6 žingsnis: Pagrindinio evoliucinio ciklo paleidimas
Čia evoliucinis algoritmas atgyja. DEAP teikia aukšto lygio algoritmus, tokius kaip eaSimple, kurie apima standartinį kartų evoliucinį procesą. Jūs nurodote populiaciją, toolbox, genetinių operatorių tikimybes, kartų skaičių ir statistikos tvarkytojus.
NGEN = 50 # Evoliucionavimui vykdyti skiriamų kartų skaičius
POP_SIZE = 300 # Populiacijos dydis (asmenų skaičius)
CXPB = 0.9 # Kryžminimo tikimybė taikyti asmeniui
MUTPB = 0.1 # Mutacijos tikimybė taikyti asmeniui
population = toolbox.population(n=POP_SIZE) # Pirmosios kartos inicializavimas
# Evoliucinio algoritmo paleidimas
# eaSimple yra paprastas kartų evoliucinis algoritmas
population, log = tools.algorithms.eaSimple(population, toolbox, CXPB, MUTPB, NGEN,
stats=mstats, halloffame=hof, verbose=True)
# Visų kartų metu rastas geriausias programos variantas yra saugomas hof[0]
best_program = hof[0]
print(f"Rastas geriausias programos variantas: {best_program}")
7 žingsnis: Rezultatų analizė ir geriausios programos interpretacija
Baigus evoliucinį procesą, analizuokite žurnalus ir geriausią asmenį, rastą HallOfFame. Galite vizualizuoti evoliucionuotą programos medį, sudaryti jį, kad patikrintumėte jo veikimą su nematytų duomenų, ir pabandyti interpretuoti jo logiką. Simbolinės regresijos atveju tai reiškia, kad reikia išnagrinėti atrastą matematinę išraišką.
# Geriausios programos vertinimas mokymo duomenimis, kad patvirtintumėte jos tinkamumą
final_fitness = toolbox.evaluate(best_program)
print(f"Galutinis rastos geriausios programos tinkamumas mokymui: {final_fitness}")
# Neprivaloma, sudaryti ir išbandyti su naujais, nematytų duomenimis, kad patikrintumėte generalizaciją
# new_test_points = [(6, 12), (7, 14)]
# new_test_labels = [6**2 + 12, 7**2 + 14]
# test_fitness = evalSymbReg(best_program, new_test_points, new_test_labels)
# print(f"Rastos geriausios programos tinkamumas bandymui: {test_fitness}")
# Medžio vizualizavimui (reikalingas įdiegtas graphviz ir pasiekiamas PATH)
# from deap import gp
# import matplotlib.pyplot as plt
# nodes, edges, labels = gp.graph(best_program)
# import pygraphviz as pgv
# g = pgv.AGraph()
# g.add_nodes_from(nodes)
# g.add_edges_from(edges)
# g.layout(prog='dot')
# for i in nodes: g.get_node(i).attr['label'] = labels[i]
# g.draw('best_program.pdf')
Praktinės Python genetinio programavimo programos (Pasauliniai pavyzdžiai)
GP gebėjimas automatiškai kurti programas daro ją neįkainojama priemone įvairiose pramonės šakose ir tyrimų srityse visame pasaulyje. Štai keletas patrauklių pasaulinių pavyzdžių:
1. Simbolinė regresija: Paslėptų santykių atskleidimas duomenyse
Aprašymas: Pateikus duomenų rinkinį su įvesties-išvesties poromis, GP gali evoliucionuoti matematinę išraišką, kuri geriausiai apibūdina santykį tarp jų. Tai panašu į automatinį mokslinį atradimą, leidžiantį tyrėjams atskleisti pagrindinius įstatymus be išankstinių prielaidų apie jų formą.
Pasaulinis poveikis:
- Klimato mokslas: Naujų klimato modelių atradimas iš jutiklių duomenų, surinktų įvairiuose geografiniuose regionuose, padedant prognozuoti orų modelius arba aplinkos pokyčių poveikį įvairiose ekosistemose nuo Amazonės lietaus miškų iki Arkties ledo kepurių.
- Ekonomika ir finansai: Prognozuojamų formulių išvedimas akcijų rinkos judėjimui, prekių kainoms ar makroekonominiams rodikliams, padedant finansų analitikams ir politikams įvairiose pasaulio rinkose (pvz., prognozuojant infliaciją besivystančiose rinkose arba valiutų kursų svyravimus tarp pagrindinių valiutų).
- Fizika ir inžinerija: Fizinių įstatymų ar inžinerinių projektavimo lygčių automatinis išvedimas iš eksperimentinių duomenų, pagreitinant tyrimus medžiagų mokslo ar sudėtingų sistemų projektavimo srityje, naudojamų aviacijos inžinerijoje nuo Europos iki Azijos.
2. Mašininis mokymasis: Automatinis modelių dizainas ir bruožų inžinerija
Aprašymas: GP gali būti naudojamas mašininio mokymosi procesų komponentams evoliucionuoti, vedant prie labiau patikimų ir pritaikytų sprendimų nei vien tik žmonių suprojektuoti modeliai.
Pasaulinis poveikis:
- Automatinė bruožų inžinerija (AutoFE): Naujų, labai prognozuojančių bruožų evoliucionavimas iš žaliavų duomenų, kuris gali žymiai padidinti tradicinių mašininio mokymosi modelių veikimą. Pavyzdžiui, sveikatos priežiūros srityje GP galėtų sujungti žaliavinius paciento gyvybinius požymius iš Afrikos ir Azijos klinikų, kad sukurtų bruožus, labiau rodančius ligos progresavimą, pagerinant diagnostinį tikslumą visame pasaulyje.
- Modelių pasirinkimas ir hiperparametrų optimizavimas: GP gali ieškoti optimalių mašininio mokymosi modelių architektūrų (pvz., neuroninio tinklo topologijos) ar hiperparametrų nustatymų, automatizuodamas dažnai laiką reikalaujantį modelio kūrimo procesą. Tai labai svarbu organizacijoms visame pasaulyje, leidžiant greičiau diegti DI sprendimus.
- Sprendimų medžių/taisyklių evoliucionavimas: Labai interpretuojamų klasifikavimo ar regresijos taisyklių generavimas, kurias gali suprasti ekspertai, padedant priimti sprendimus tokiose srityse kaip kredito rizikos vertinimas įvairiose nacionalinėse ekonomikose ar ligų protrūkio prognozavimas visuomenės sveikatos sistemose visame pasaulyje.
3. Robotika ir valdymo sistemos: Adaptuojantys autonominiai agentai
Aprašymas: GP puikiai tinka valdymo strategijoms ar robotų ir autonominių agentų elgesiui evoliucionuoti, ypač dinamiškoje ar neapibrėžtoje aplinkoje, kur tiesioginis programavimas yra sudėtingas.
Pasaulinis poveikis:
- Autonominė navigacija: Valdymo programų evoliucionavimas bepiločiams orlaiviams (UAV) ar antžeminiams robotams, veikiantiems įvairiuose reljefuose, nuo Šiaurės Amerikos miestų aplinkos iki Australijos atokių agrarinių žemių, be tiesioginio kiekvienos galimos situacijos programavimo.
- Pramonės automatizavimas: Robotų rankų judesių optimizavimas efektyvumui ir tikslumui gamybos įmonėse, nuo Vokietijos automobilių gamyklų iki Pietų Korėjos elektronikos gamybos linijų, vedant prie didesnio produktyvumo ir mažiau atliekų.
- Išmanioji infrastruktūra: Judrių didmiesčių, tokių kaip Tokijas ar Mumbajus, eismo valdymo sistemų adaptavimas, optimizuojant eismo srautą realiu laiku, siekiant sumažinti spūstis ir taršą.
4. Žaidimų DI ir modeliavimai: Protingi ir adaptuojantys priešininkai
Aprašymas: GP gali kurti sudėtingą ir į žmones panašų DI žaidimams arba optimizuoti elgesį modeliavimuose, vedant prie įtraukiančių patirčių ar tikslesnių prognozuojančių modelių.
Pasaulinis poveikis:
- Dinamiškas žaidimo eiga: DI priešininkų evoliucionavimas, kurie prisitaiko prie žaidėjo strategijų realiu laiku, siūlydami sudėtingesnę ir personalizuotesnę žaidimų patirtį žaidėjams visame pasaulyje, nuo paprastų mobiliųjų žaidimų iki konkurencingų e-sportų.
- Strateginiai modeliavimai: Sudėtingų agentų kūrimas ekonominiams ar kariniams modeliavimams, leidžiant analitikams išbandyti įvairias strategijas ir prognozuoti geopolitinių scenarijų ar tarptautinių plėtros programų išteklių valdymo rezultatus.
5. Finansinis modeliavimas: Prekybos strategijų ir rizikos valdymo evoliucionavimas
Aprašymas: GP gali atrasti naujus modelius ir kurti prognozuojančius modelius finansų rinkose, kurios yra žinomai sudėtingos ir nenukreipiamos.
Pasaulinis poveikis:
- Automatinės prekybos strategijos: Algoritmų evoliucionavimas, kurie nustato pelningus įėjimo ir išėjimo taškus įvairiems finansiniams instrumentams skirtingose biržose (pvz., Niujorko vertybinių popierių birža, Londono vertybinių popierių birža, Tokijo vertybinių popierių birža), prisitaikant prie įvairių rinkos sąlygų ir reguliavimo aplinkos.
- Rizikos vertinimas: Modelio kūrimas kreditinės rizikos vertinimui fiziniams asmenims ar įmonėms įvairiose ekonomikose, įtraukiant vietinius ir pasaulinius ekonominius kintamuosius, padedant bankams ir finansų institucijoms priimti informuotus sprendimus visuose jų tarptautiniuose portfeliuose.
6. Vaistų atradimas ir medžiagų mokslas: Struktūrų ir savybių optimizavimas
Aprašymas: GP gali tyrinėti didžiules projektavimo erdves, kad optimizuotų molekulines struktūras vaistų veiksmingumui arba medžiagų sudėtį norimoms savybėms.
Pasaulinis poveikis:
- Vaistų kandidatų generavimas: Cheminiams junginiams su specifinėmis pageidaujamomis savybėmis (pvz., prisijungimo afinitetui prie tikslinio baltymo) evoliucionavimas, pagreitinant vaistų atradimo procesą pasaulinėms sveikatos problemoms, tokioms kaip pandemijos ar apleistos ligos.
- Naujų medžiagų projektavimas: Naujų medžiagų sudėčių ar struktūrų, turinčių pagerintas savybes (pvz., stiprumas, laidumas, atsparumas karščiui), atradimas taikomosioms sritims nuo aviacijos ir kosmoso komponentų iki tvarios energijos technologijų, prisidedant prie pasaulinių inovacijų gamybos ir žaliosios energijos srityse.
Populiarios Python bibliotekos genetiniam programavimui
Python stiprybė GP gerokai padidėja dėl specializuotų bibliotekų, kurios abstrahuoja didžiąją dalį pagrindinio kodo, leidžiantis kūrėjams sutelkti dėmesį į problemos specifiką.
1. DEAP (Distributed Evolutionary Algorithms in Python)
DEAP yra bene plačiausiai naudojamas ir lanksčiausias karkasas evoliucinei kompiuterinei įmonei Python. Ji teikia išsamų įrankių ir duomenų struktūrų rinkinį įvairių tipų evoliuciniams algoritmams įgyvendinti, įskaitant genetinį programavimą, genetinius algoritmus, evoliucines strategijas ir kt.
- Pagrindinės savybės:
- Lanksti architektūra: Labai modulinė, leidžia vartotojams derinti skirtingus atrankos operatorius, kryžminimo metodus, mutacijos strategijas ir baigimo kriterijus.
- Medžių pagrindu GP palaikymas: Puikus palaikymas medžių pagrindu programų atvaizdavimui su
PrimitiveSetir specializuotais genetiniais operatoriais. - Lygiagretinimas: Integruotas palaikymas lygiagrečiam ir paskirstytam vertinimui, būtinas skaičiavimo atžvilgiu intensyvioms GP užduotims.
- Statistika ir registravimas: Įrankiai populiacijos statistikai ir geriausiems asmenims stebėti per kartas.
- Vadovėliai ir dokumentacija: Plati dokumentacija ir pavyzdžiai palengvina mokymąsi ir įgyvendinimą.
- Kodėl pasirinkti DEAP? Tyrėjams ir kūrėjams, kuriems reikalingas smulkus savo evoliucinių algoritmų valdymas ir ketinantiems tyrinėti pažangius GP metodus, DEAP yra pirmenybė dėl savo lankstumo ir galios.
2. PyGAD (Python Genetic Algorithm for Deep Learning and Machine Learning)
Nors daugiausia dėmesio skiriama genetiniams algoritmams (GA) parametrų optimizavimui (pvz., svorių neuroniniuose tinkluose), PyGAD yra patogus naudoti biblioteka, kuri gali būti pritaikyta paprastesnėms GP panašioms užduotims, ypač jei "programa" gali būti atstovaujama kaip fiksuoto ilgio veiksmų ar parametrų seka.
- Pagrindinės savybės:
- Naudojimo paprastumas: Paprastesnė API, todėl labai greitai nustatyti ir paleisti pagrindinius GA.
- Integravimas su giluminiais tinklais: Didelis dėmesys skiriamas integracijai su giluminio mokymosi karkasais, tokiais kaip Keras ir PyTorch, modelių optimizavimui.
- Vizualizavimas: Apima funkcijas, skirtas tinkamumo vaizdavimui per kartas.
- Apsvarstymai dėl GP: Nors iš esmės tai nėra "Genetinio programavimo" biblioteka tradicine medžių pagrindu prasme, PyGAD gali būti naudojama operacijų ar konfigūracijos nustatymų sekoms evoliucionuoti, kurios gali priminti linijinę genetinę programą, jei problemos sritis leidžia tokį atvaizdavimą. Ji labiau tinka problemoms, kuriose struktūra yra šiek tiek fiksuota, o parametrai yra evoliucionuojami.
3. GpLearn (Genetic Programming in Scikit-learn)
GpLearn yra scikit-learn suderinama biblioteka genetiniam programavimui. Jos pagrindinis dėmesys skiriamas simbolinei regresijai ir klasifikacijai, leidžiant jai nepastebimai integruotis į esamus scikit-learn mašininio mokymosi procesus.
- Pagrindinės savybės:
- Scikit-learn API: Įprasti
.fit()ir.predict()metodai palengvina ML specialistams darbą. - Simbolinė regresija ir klasifikacija: Specializuota šioms užduotims, siūlanti tokias funkcijas kaip automatinė bruožų inžinerija.
- Integruotos funkcijos: Suteikia gerą rinkinį pagrindinių matematinių ir loginių operatorių.
- Scikit-learn API: Įprasti
- Kodėl pasirinkti GpLearn? Jei jūsų pagrindinė programa yra simbolinė regresija ar klasifikacija ir jūs jau dirbate scikit-learn ekosistemoje, GpLearn suteikia patogų ir efektyvų būdą taikyti GP be reikšmingo pagrindinio kodo.
Pažangios temos ir apsvarstymai Python genetiniame programavime
Kai gilinsitės į GP, iškyla kelios pažangios temos ir apsvarstymai, kurie gali žymiai paveikti jūsų algoritmų veikimą ir pritaikomumą.
1. Programų "išsipūtimo" valdymas
Vienas dažnų GP iššūkių yra "išsipūtimas" – tendencija, kad evoliucionuotos programos tampa pernelyg didelės ir sudėtingos, be atitinkamo tinkamumo padidėjimo. Didelės programos yra brangiai kainuojančios skaičiuojant ir dažnai sunkiau interpretuojamos. Strategijos, kaip kovoti su išsipūtimu, apima:
- Dydžio/gilumo ribos: Nustatyti aiškius programos medžio maksimalaus gilumo ar mazgų skaičiaus apribojimus.
- Parimio spaudimas: Tinkamumo funkcijos modifikavimas, kad būtų baudžiamos didesnės programos, skatinant paprastesnius sprendimus (pvz.,
fitness = accuracy - alpha * size). - Alternatyvūs atrankos mechanizmai: Naudojant atrankos metodus, tokius kaip Lexicase atranka ar amžiaus-tinkamumo Pareto optimizacija, kurie nepastebimai teikia pirmenybę mažesniems, vienodai tinkamiems asmenims.
- Operatoriaus dizainas: Kryžminimo ir mutacijos operatorių dizainas, kurie mažiau linkę generuoti per dideles programas.
2. Moduliškumas ir automatiškai apibrėžtos funkcijos (ADF)
Tradicinis GP evoliucionuoja vieną pagrindinę programą. Tačiau realaus pasaulio programos dažnai naudoja moduliškumą – gebėjimą apibrėžti ir pakartotinai naudoti subrutinas. Automatiškai apibrėžtos funkcijos (ADF) plečia GP, kad ji evoliucionuotų ne tik pagrindinę programą, bet ir vieną ar daugiau subprogramų (funkcijų), kurias pagrindinė programa gali kviesti. Tai leidžia hierarchiškai spręsti problemas, pagerinti kodo pakartotinį naudojimą ir potencialiai kompaktiškesnius bei efektyvesnius sprendimus, atspindinčius tai, kaip žmonės dalija sudėtingas užduotis.
3. Lygiagretus ir paskirstytas GP
GP gali būti skaičiavimo atžvilgiu intensyvi, ypač su didelėmis populiacijomis ar sudėtingomis tinkamumo funkcijomis. Lygiagretinimas ir paskirstytasis skaičiavimas yra būtini GP masteliui didinti, kad būtų galima spręsti sudėtingas problemas. Strategijos apima:
- Stambios granulės lygiagretinimas (salos modelis): Kelių nepriklausomų GP populiacijų ("salų") lygiagretus vykdymas, su retu asmenų migracija tarp jų. Tai padeda išlaikyti įvairovę ir kartu tyrinėti skirtingas paieškos erdvės dalis.
- Smulkios granulės lygiagretinimas: Asmenų vertinimų ar genetinių operatorių taikymo paskirstymas per kelias šerdis ar mašinas. Tokios bibliotekos kaip DEAP siūlo integruotą palaikymą lygiagrečiam vykdymui naudojant multiprocessing ar Dask.
4. Daugiatikslis genetinio programavimas
Daugelis realaus pasaulio problemų apima kelis, dažnai prieštaringus tikslus, tuo pačiu metu optimizuojant. Pavyzdžiui, inžineriniame projektavimo užduotyje galima norėti maksimaliai padidinti našumą, tuo pačiu sumažinant išlaidas. Daugiatikslis GP siekia rasti Pareto optimalių sprendimų rinkinį – sprendimus, kuriuose joks tikslas negali būti pagerintas nepadidinant bent vieno kito tikslo. Algoritmai, tokie kaip NSGA-II (Non-dominated Sorting Genetic Algorithm II), buvo pritaikyti GP, kad būtų galima tvarkyti tokius scenarijus.
5. Gramatikos vadovaujamas genetinio programavimas (GGGP)
Standartinis GP kartais gali generuoti sintaksiškai ar semantiškai neteisingas programas. Gramatikos vadovaujamas GP sprendžia tai, įtraukiant formalų gramatiką (pvz., Backus-Naur Form ar BNF) į evoliucinį procesą. Tai užtikrina, kad visos generuojamos programos atitiktų iš anksto nustatytus struktūrinius ar domenui specifinius apribojimus, todėl paieška tampa efektyvesnė, o evoliucionuotos programos – prasmingesnės. Tai ypač naudinga, kai evoliucionuojamos programos specifinėmis programavimo kalbomis arba domenams, turintiems griežtas taisykles, tokioms kaip tinkamų SQL užklausų ar molekulinių struktūrų generavimas.
6. Integracija su kitomis DI paradigmomis
DI laukų ribos vis labiau nyksta. GP gali būti efektyviai derinamas su kitomis DI technikomis:
- Hibridiniai metodai: Naudoti GP bruožų inžinerijai prieš pateikiant duomenis neuroniniam tinklui, arba naudoti GP giluminio mokymosi modelio architektūrai evoliucionuoti.
- Neuroevoliucija: Dalinis laukas, kuris naudoja evoliucinius algoritmus dirbtinių neuroninių tinklų evoliucionavimui, įskaitant jų svorius, architektūras ir mokymosi taisykles.
Iššūkiai ir apribojimai Python genetiniame programavime
Nepaisant jos nuostabios galios, Genetinė programavimas nėra be iššūkių:
- Skaičiavimo kaštai: GP gali būti labai reikalaujantis resursų, reikalaujantis ženklios skaičiavimo galios ir laiko, ypač su didelėmis populiacijomis, daugybe kartų ar sudėtingais tinkamumo vertinimais.
- Tinkamumo funkcijos projektavimas: Tinkamos ir veiksmingos tinkamumo funkcijos sukūrimas dažnai yra sunkiausia dalis. Blogai suprojektuota tinkamumo funkcija gali lemti lėtą konvergenciją, ankstyvą konvergenciją arba suboptimalių sprendimų evoliucionavimą.
- Interpretacija: Nors GP siekia atrasti interpretuojamas programas (skirtingai nuo nepermatomų neuroninių tinklų), evoliucionavę medžiai vis tiek gali tapti labai sudėtingi, todėl žmonėms sunku juos suprasti ar derinti, ypač su "išsipūtimo" problema.
- Parametrų derinimas: Kaip ir kiti evoliuciniai algoritmai, GP turi daug hiperparametrų (pvz., populiacijos dydis, kryžminimo tikimybė, mutacijos tikimybė, atrankos metodas, pradinių rinkinių komponentai, gilumo ribos), kuriuos reikia kruopščiai derinti, kad būtų pasiektas optimalus veikimas, dažnai atliekant daugybę eksperimentų.
- Generalizacija prieš perkrovą: Evoliucionuotos programos gali labai gerai veikti su mokymo duomenimis, bet nepavykti generalizuoti nematytų duomenų atžvilgiu. Strategijos, tokios kaip kryžminė patikra ir aiškūs reguliarizacijos terminai tinkamumo funkcijoje, yra būtinos.
Būsimos tendencijos genetiniame programavime su Python
Genetinės programavimo sritis nuolat sparčiai vystosi, skatinama skaičiavimo galios pažangos ir novatoriškų tyrimų. Būsimos tendencijos apima:
- Integravimas su giluminiais tinklais: Glaudesnė integracija su giluminio mokymosi karkasais, naudojant GP naujoms neuroninių tinklų architektūroms atrasti, hiperparametrų optimizuoti arba duomenų papildymo strategijoms generuoti. Tai galėtų lemti naujos kartos patikimesnių ir autonomiškesnių DI sistemų kūrimą.
- Automatinis mašininis mokymasis (AutoML): GP yra natūralus pasirinkimas AutoML, nes ji gali automatizuoti įvairius mašininio mokymosi proceso etapus, nuo bruožų inžinerijos ir modelių pasirinkimo iki hiperparametrų optimizavimo, todėl DI tampa prieinamesnis platesniam nemokslininkų auditorijai visame pasaulyje.
- Paaiškinamas DI (XAI) GP atveju: Metodų kūrimas, siekiant padaryti sudėtingas evoliucionavusias programas labiau interpretuojamas ir paaiškinamas žmogaus vartotojams, didinant pasitikėjimą ir pritaikomumą kritinėse programose, tokiose kaip sveikatos priežiūra ir finansai.
- Nauji atvaizdavimai: Alternatyvių programų atvaizdavimų, ne tik tradicinių medžių struktūrų, tokių kaip grafų pagrindu sistemas, gramatikos pagrindu sistemas, ar net neuroninių programų atvaizdavimų, tyrinėjimas, kad būtų išplėstas GP apimtis ir efektyvumas.
- Mastelis ir efektyvumas: Nuolatiniai lygiagrečių, paskirstytų ir debesų pagrindu veikiančių GP diegimų pažanga, siekiant spręsti vis didesnes ir sudėtingesnes problemas.
Išvada: Evoliucinio intelekto priėmimas su Python
Genetinė programavimo, paremta Python universalumu, yra nuostabi evoliucijos principų jėga. Ji siūlo unikalią ir galingą problemų sprendimo metodą, galintį atrasti naujus ir netikėtus sprendimus, kur tradiciniai metodai nepavyksta. Nuo mokslinių duomenų paslapčių atskleidimo iki intelektualių agentų projektavimo ir sudėtingų sistemų optimizavimo įvairiose pasaulinėse pramonės šakose, GP su Python leidžia specialistams stumti galimybių ribas dirbtinio intelekto srityje.
Supratę jos branduolio koncepcijas, kruopščiai suprojektavę tinkamumo funkcijas ir pradinius rinkinius, ir pasinaudodami tvirtomis bibliotekomis, tokiomis kaip DEAP, galite panaudoti evoliucinių algoritmų potencialą, kad išspręstumėte kai kurias sudėtingiausių pasaulio skaičiavimo problemų. Kelionė į genetinį programavimą yra atradimo, inovacijų ir nuolatinio pritaikymo kelionė – kelionė, kurioje jūsų kodas ne tik vykdo instrukcijas, bet ir protingai juos evoliucionuoja. Priimkite Python galią ir evoliucijos eleganciją ir pradėkite kurti savo kitos kartos intelektualius sprendimus jau šiandien.